package com.auto.survey.base

import android.util.Log
import com.auto.survey.activity.bluetooth.BluetoothManagerUtil
import com.auto.survey.log.AppLogger
import com.auto.survey.widget.CentreToast

object Command {

    private val TAG:String = Command::class.java.simpleName


    fun pointTypaList():List<String>{
        return listOf("监测点", "工作基点", "控制基点")
    }







    /**
     * #######################################################
     * 系统状态与配置
     * #######################################################
     */

    /**
     * 查询全站仪的精度等级和配置类型，获取仪器的基础技术参数
     * 仪器返回示例：%R1P,0,0:0,910,4197022
     */
    val CSV_GetDeviceConfig:String = "\n%R1Q,5035:\r\n"

    /**
     * 获取全站仪的型号名称，确认连接的仪器类型
     * 仪器返回示例：%R1P,0,0:0,"MS60 CHINA"
     */
    val CSV_GetInstrumentName:String = "\n%R1Q,5004:\r\n"

    /**
     * 获取全站仪的出厂序列号，唯一标识仪器设备
     * 仪器返回示例：%R1P,0,0:0,892668
     */
    val CSV_GetInstrumentNo:String = "\n%R1Q,5003:\r\n"

    /**
     * 获取全站仪主板的内部温度，监测仪器工作状态。
     * 仪器返回示例：%R1P,0,0:0,35
     */
    val CSV_GetIntTemp:String = "\n%R1Q,5011:\r\n"

    /**
     * 获取全站仪内部时钟的当前日期和时间，确保测量数据的时间戳一致性
     * 仪器返回示例：%R1P,0,0:0,2025,'06','05','11','30','23'
     */
    val CSV_GetDateTime:String = "\n%R1Q,5008:\r\n"

    /**
     * 设置全站仪的内部时钟，确保测量数据时间戳的准确性。
     * 仪器返回示例：%R1P,0,0:0
     */
    val CSV_SetDateTime:String = "\n%R1Q,5007:\r\n"

    /**
     * 验证全站仪与客户端之间的通信链路是否存活，无实际功能操作。
     * 仪器返回示例：%R1P,0,0:0
     */
    val COM_NullProc:String = "\n%R1Q,0:\r\n"

    /**
     * 控制全站仪的关机模式，支持不同级别的电源管理。
     * 仪器返回示例：%R1P,0,1:0
     */
    val COM_SwitchOffTPS:String ="\n%R1Q,112,1:\r\n"

    /**
     * 远程唤醒或启动全站仪，支持不同的启动模式。
     */
    val COM_SwitchOnTPS:String = "\n%R1Q,111,1:\r\n"

    /**
     * 查询全站仪的自动关机配置参数，包括关机机制和超时时间。
     * 仪器返回示例：%R1P,0,0:0,1,0,600000
     */
    val SUP_GetConfig:String = "\n%R1Q,14001:\r\n"

    /**
     * 配置全站仪的自动关机参数，包括关机模式和超时时间。
     * 仪器返回示例：%R1P,0,0:0
     */
    val SUP_SetConfig:String = "\n%R1Q,14002:0,0,500000\r\n"


    /**
     * #######################################################
     * 电机控制
     * #######################################################
     */

    /**
     * 启动全站仪电机控制器并设置控制模式，允许通过软件远程控制仪器转动。
     * 仪器返回示例：%R1P,0,0:0
     */
    val MOT_StartController = "\n%R1Q,6001:1\r\n"

    /**
     * 设置全站仪电机驱动的水平（HZ）和垂直（V）旋转速度。
     * 仪器返回示例：%R1P,0,0:0
     */
    val MOT_SetVelocity:String = "\n%R1Q,6004:0.5,0.5\r\n"

    /**
     * 停止全站仪电机的当前运动，并关闭电机控制器
     * 仪器返回示例：%R1P,0,0:0
     */
    val MOT_StopController:String = "\n%R1Q,6002:\r\n"

    /**
     * #######################################################
     * 补偿与校正
     * #######################################################
     */
    /**
     * 取全站仪角度测量的校正状态，包括倾斜校正、竖轴校正、视准轴校正和横轴校正。
     * 仪器返回示例：%R1P,0,0:0,1,1,1,1
     */
    val TMC_GetAngSwitch :String= "\n%R1Q,2014:\r\n"

    /**
     * 获取当前双轴补偿器的状态，即双轴补偿器是否开启。
     * 仪器返回示例：%R1P,0,0:0,1
     */
    val TMC_GetInclineSwitch:String ="\n%R1Q,2007:\r\n"

    /**
     * 获取当前使用的棱镜常数，
     * 仪器返回示例：%R1P,0,0:0,0
     */
    val TMC_GetPrismCorr:String = "\n%R1Q,2023:\r\n"

    /**
     * 获取大气折射校正参数，包括折射校正开关状态、地球曲率半径和折射比例系数。
     * 仪器返回示例：%R1P,0,0:0,1,6378000,0.13
     */
    val TMC_GetRefractiveCorr:String = "\n%R1Q,2031:\r\n"

    /**
     * 手动设置大气折射与地球曲率校正参数，以修正高差测量中因大气折射和地球曲率引起的系统性误差。
     *
     */
    val TMC_SetRefractiveCorr:String ="\n%R1Q,2030:\r\n"

    /**
     * 启用或禁用角度测量校正功能，包括倾斜校正、竖轴校正、视准轴校正和横轴校正。
     * 仪器返回示例：%R1P,0,0:0
     */
    val TMC_SetAngSwitch:String = "\n%R1Q,2016:1,1,1,1\r\n"

    /**
     * 设置大气校正参数（温度、气压、湿度），以补偿因大气条件导致的距离测量误差。
     */
    val TMC_SetAtmCorr:String = "\n%R1Q,2028:\r\n"
    /**
     * #######################################################
     * ATR与LOCK模式
     * #######################################################
     */

    /**
     * 控制全站仪的 ATR（自动目标识别）模式开关状态
     * 仪器返回示例：%R1P,0,0:0
     */
    val AUS_SetUserAtrState:String = "\n%R1Q,18005:1\r\n"

    /**
     * 获取 ATR（自动目标识别）模式的当前状态
     * 仪器返回示例：%R1P,0,0:0,1
     */
    val AUS_GetUserAtrState:String = "\n%R1Q,18006:\r\n"

    fun sendGetUserAtrState(bluetoothManager: BluetoothManagerUtil){
        sendBlueData(AUS_GetUserAtrState, bluetoothManager)
    }

    fun parseAUS_GetUserAtrState(rltdata:String):Boolean?{
        AppLogger.getInstance(CustomApplication.getContext()).i(TAG, "parseAUS_GetUserAtrState ## $rltdata")
        var rlt:Boolean?=null
        val data =rltdata.trim('\r', '\n')
        try {

            // 检查数据格式是否符合预期
            if (data.isBlank() || !data.startsWith("%R1P")) {
                Log.e(TAG, "parseAUS_GetUserAtrState，数据格式不正确")
                AppLogger.getInstance(CustomApplication.getContext()).e(TAG, "parseAUS_GetUserAtrState，数据格式不正确")
                return null
            }

            // 按冒号分割，获取数据部分
            val parts = data.split(":")
            if (parts.size != 2) {
                Log.e(TAG, "parseAUS_GetUserAtrState，数据格式不正确，缺少冒号分隔符")
                AppLogger.getInstance(CustomApplication.getContext()).e(TAG, "parseAUS_GetUserAtrState，数据格式不正确，缺少冒号分隔符")
                return null
            }

            // 按逗号分割数据部分 %R1P,0,0:0,1\r\n
            val values = parts[1].split(",")
            if (values.size > 0) {
                val RC = values[0].toInt()
                if (RC != 0) {
                    CentreToast.instance.show("获取ATR状态出错，请通过日志排查问题", false)
                    return false
                }

                val ATR_RLT = values[1].toInt()
                if (ATR_RLT == 1) {
                    rlt = true
                } else {
                    rlt = false
                }

                val log = "函数parseAUS_GetUserAtrState，获取 ATR（自动目标识别）模式的当前状态:ATR_RLT: $ATR_RLT"
                Log.i(TAG,log)
                AppLogger.getInstance(CustomApplication.getContext()).i(TAG, log)

            } else {
                AppLogger.getInstance(CustomApplication.getContext()).e(TAG, "函数parseAUS_GetUserAtrState，数据部分缺少必要的字段")
            }

        } catch (e: NumberFormatException) {
            Log.i(TAG,"函数parseAUS_GetUserAtrState，数值转换错误: ${e.message}")
            AppLogger.getInstance(CustomApplication.getContext()).e(TAG, "函数parseAUS_GetUserAtrState，数值转换错误: ${e.message}")
        } catch (e: Exception) {
            Log.i(TAG,"函数parseAUS_GetUserAtrState，解析过程中发生错误: ${e.message}")
            AppLogger.getInstance(CustomApplication.getContext()).e(TAG, "函数parseAUS_GetUserAtrState，解析过程中发生错误: ${e.message}")
        }

        return rlt
    }



    /**
     * 控制全站仪的望远镜旋转到另一面（盘左 / 盘右切换）
     * 仪器返回示例：%R1P,0,0:0
     */
    val AUT_ChangeFace:String = "\n%R1Q,9028:0,0,0\r\n"

    /**
     * 用于精确调整全站仪望远镜的十字丝对准目标棱镜，并在必要时进行目标搜索
     *  仪器返回示例：%R1P,0,0:8710
     */
    val AUT_FineAdjust:String = "\n%R1Q,9037:0.1745,0.1745\r\n";





    val TMC_SetStation:String = "\n%R1Q,2010:\r\n"   //设置全站仪的测站坐标和仪器高，建立测量基准。
    val TMC_SetHeight :String = "\n%R1Q,2012:\r\n"   //设置棱镜或反射片的高度，影响坐标计算中的高程分量。


    val TMC_SetHandDist:String = "\n%R1Q,2019:\r\n";//手动输入斜距和高度偏移值，结合仪器自动测量的角度和倾角数据，计算目标点坐标。



    /**
     * #######################################################
     * 测量功能与参数
     * #######################################################
     */

    /**
     * 在存在有效距离的情况下获取笛卡尔坐标（东坐标 E、北坐标 N、高程 H）。
     */
    val TMC_GetSimpleCoord:String = "\n%R1Q,2116:1000,1,1,1,1\r\n"//在存在有效距离的情况下获取笛卡尔坐标（东坐标 E、北坐标 N、高程 H）。

    /**
     * 需要使用1
     * 获取仪器的测站坐标，包括东坐标、北坐标、高程以及仪器高。
     */
    val TMC_GetStation:String = "\n%R1Q,2009:\r\n"
    //解析获取仪器的测站坐标函数
    val KEY_TMC_GETSTATION_E0 = "KEY_TMC_GETSTATION_E0"
    val KEY_TMC_GETSTATION_N0 = "KEY_TMC_GETSTATION_N0"
    val KEY_TMC_GETSTATION_H0 = "KEY_TMC_GETSTATION_H0"

    fun sendTMC_GetStation(bluetoothManager: BluetoothManagerUtil){
        sendBlueData(TMC_GetStation, bluetoothManager)
    }

    //例如%R1P,0,0:0,859.05064122537044,1390.6244441423153,11.665841217653076,1.372200012207031
    fun parseTMC_GetStation(data:String): Map<String, Double>? {
        AppLogger.getInstance(CustomApplication.getContext()).i(TAG, "parseTMC_GetStation ## $data")
        var map:HashMap<String, Double>?=null

        try {
            // 检查数据格式是否符合预期
            if (data.isBlank() || !data.startsWith("%R1P")) {
                Log.e(TAG, "函数parseTMC_GetStation，数据格式不正确")
                AppLogger.getInstance(CustomApplication.getContext()).e(TAG, "函数parseTMC_GetStation，数据格式不正确")
                return map
            }
            // 按冒号分割，获取数据部分
            val parts = data.split(":")

            if (parts.size != 2) {
                Log.e(TAG, "函数parseTMC_GetStation，数据格式不正确，缺少冒号分隔符")
                AppLogger.getInstance(CustomApplication.getContext()).e(TAG, "函数parseTMC_GetStation，数据格式不正确，缺少冒号分隔符")
                return map
            }
            // 按逗号分割数据部分
            val values = parts[1].split(",")

            if (values.size >= 5) {
                // 这里我们提取E0、N0、H0和Hi的值
                val E0 = values[1].toDouble()
                val N0 = values[2].toDouble()
                val H0 = values[3].toDouble()
                val Hi = values[4].toDouble()

                map = java.util.HashMap()

                // 输出解析结果
                map[KEY_TMC_GETSTATION_E0] = E0
                map[KEY_TMC_GETSTATION_N0] = N0
                map[KEY_TMC_GETSTATION_H0] = H0

                val log = "函数parseTMC_GetStation，获取仪器的测站坐标:E0: $E0， N0: $N0， H0: $H0， Hi: $Hi"
                Log.i(TAG,log)
                AppLogger.getInstance(CustomApplication.getContext()).i(TAG, log)

            } else {
                AppLogger.getInstance(CustomApplication.getContext()).e(TAG, "函数parseTMC_GetStation，数据部分缺少必要的字段")
            }

        } catch (e: NumberFormatException) {
            Log.i(TAG,"函数parseTMC_GetStation，数值转换错误: ${e.message}")
            AppLogger.getInstance(CustomApplication.getContext()).e(TAG, "函数parseTMC_GetStation，数值转换错误: ${e.message}")
        } catch (e: Exception) {
            Log.i(TAG,"函数parseTMC_GetStation，解析过程中发生错误: ${e.message}")
            AppLogger.getInstance(CustomApplication.getContext()).e(TAG, "函数parseTMC_GetStation，解析过程中发生错误: ${e.message}")
        }

        return map
    }


    /**
     * 获取全站仪的电子测距（EDM）模式，了解当前仪器采用的测距方式。
     * 指令响应格式：%R1P,0,0:RC[long],Mode[long]
     * RC长整型返回码（0= 成功）。
     * Mode长整型EDM 测量模式：
     * 0 = 标准模式（通常用于常规测量）
     * 1 = 快速模式（牺牲一定精度以提高测量速度）
     * 2 = 高精度模式（用于对精度要求极高的测量）
     * 3 = 跟踪模式（用于连续跟踪移动目标的距离变化）
     * 例如： %R1P,0,0:0,0  # 当前为标准模式
     */
    val TMC_GetEdmMode:String = "\n%R1Q,2021:\r\n"

    fun sendTMC_GetEdmMode(bluetoothManager: BluetoothManagerUtil){
        sendBlueData(TMC_GetEdmMode, bluetoothManager)
    }

    fun parseTMC_GetEdmMode(rltdata:String) {

    }

    /**
     * 设置电子测距（EDM）的测量模式，控制测量精度、速度和适用场景。
     * 指令格式组成 %R1Q,2020:Mode[long]
     * Mode 长整型 EDM 测量模式（具体数值含义需参考仪器文档，常见模式如下）：
     * 0 = 精测模式（高精度、低速）
     * 1 = 快速模式（中精度、高速）
     * 2 = 跟踪模式（低精度、连续测量）
     * 3 = 粗测模式（低精度、超高速）
     * 例如：%R1Q,2020:0  # 设置为精测模式
     *      → %R1P,0,0:0  # 设置成功
     */
    val TMC_SetEdmMode:String = "\n%R1Q,2020:0\r\n"
    fun sendTMC_SetEdmMode() {

    }

    private fun sendBlueData(tempStr:String, bluetoothManager: BluetoothManagerUtil) {
        AppLogger.getInstance(CustomApplication.getContext()).i(TAG, "sendBlueData ## $tempStr")
        if (null  != bluetoothManager.getConnectedDevices2() && bluetoothManager.getConnectedDevices2().size>0 ) {
            val temp = bluetoothManager.getConnectedDevices2()[0]
            bluetoothManager.sendDataByClient(temp, tempStr.toByteArray())
        }
    }
}